import * as CryptoJS from 'crypto-js';
import { getUrlFromData } from './helper';

const useKey = CryptoJS.enc.Utf8.parse('XS68KGVK1J85WSWB'); // 密钥16位长度字符   内容可自定义

const useIV = CryptoJS.enc.Utf8.parse('MIUBCRZYMLH282TG'); //  密钥偏移量    16位长度字符
export const CryptoSecret =
  'LET1ZXOP6GC94MPZGKNFX2LYSM7NYSHG8O354AG3Q1A4XG9MHJVA5PW6WLBPSJ34';

export const encrypt = (params: string, key = useKey, IV = useIV) => {
  // 明文参数

  const str = CryptoJS.enc.Utf8.parse(params);
  // 加密

  const encryptedData = CryptoJS.AES.encrypt(str, key, {
    iv: IV,

    mode: CryptoJS.mode.CBC, // AES加密模式

    padding: CryptoJS.pad.Pkcs7, // 填充方式
  });

  return CryptoJS.enc.Base64.stringify(encryptedData.ciphertext); // 返回base64格式密文
};
/**
 * 生成 Socket.IO 连接签名
 * @param params 连接参数
 * @param appSecret 应用密钥
 * @returns 签名对象 { sign, timestamp, nonce }
 */
export const generateSignature = (
  params: Record<string, any>,
  appSecret: string = CryptoSecret,
) => {
  // 添加时间戳和随机数
  const timestamp = Date.now().toString();

  // 计算签名
  const sign = encrypt(`${timestamp},${appSecret},${getUrlFromData(params)}`);

  return {
    sign,
  };
};
